package com.cj.controller;

import com.cj.po.Admin; // 导入Admin类，用于表示管理员信息
import com.cj.po.PageInfo; // 导入PageInfo类，用于分页信息的处理
import com.cj.service.AdminService; // 导入AdminService类，用于处理管理员相关的业务逻辑
import com.cj.util.MD5Util; // 导入MD5Util工具类，用于密码加密
import org.springframework.beans.factory.annotation.Autowired; // 导入Autowired注解，用于依赖注入
import org.springframework.stereotype.Controller; // 导入Controller注解，标识该类为控制器
import org.springframework.ui.Model; // 导入Model类，用于传递数据到视图
import org.springframework.web.bind.annotation.RequestBody; // 导入RequestBody注解，用于处理请求体
import org.springframework.web.bind.annotation.RequestMapping; // 导入RequestMapping注解，用于定义请求路径
import org.springframework.web.bind.annotation.RequestMethod; // 导入RequestMethod类，用于定义请求方法
import org.springframework.web.bind.annotation.ResponseBody; // 导入ResponseBody注解，用于返回数据而不是视图

import javax.servlet.http.HttpServletRequest; // 导入HttpServletRequest类，用于获取请求信息
import javax.servlet.http.HttpSession; // 导入HttpSession类，用于管理用户会话
import java.util.List; // 导入List类，用于处理列表数据

/**
 * 用户控制器类，负责管理员相关请求的处理
 */
@Controller
public class AdminController {
	// 依赖注入
	@Autowired
	private AdminService adminService; // 管理员服务，处理业务逻辑

	/**
	 * 用户登录
	 * @param admin 管理员对象，包含用户名和密码
	 * @param model 用于向视图传递数据
	 * @param session 管理员会话管理
	 * @param request HTTP请求
	 * @return 返回登录页面或主页
	 */
	@RequestMapping(value = "/login")
	public String login(Admin admin, Model model, HttpSession session, HttpServletRequest request) {
		// 判断账户和密码是否为空
		if(admin.getA_username() == null || admin.getA_password() == null){
			model.addAttribute("msg", "用户名或密码不能为空！"); // 添加错误信息
			return "login"; // 返回登录页面
		}
		// 通过账号和密码查询用户
		Admin ad = adminService.findAdmin(admin);
		if(ad != null) { // 登录成功
			session.setAttribute("ad", ad); // 保存管理员信息到会话中
			return "homepage"; // 返回主页
		}
		model.addAttribute("msg", "用户名或密码错误，请重新登录！"); // 添加错误信息
		return "login"; // 返回登录页面
	}

	/**
	 * 退出登录
	 * @param admin 管理员对象
	 * @param model 用于向视图传递数据
	 * @param session 管理员会话管理
	 * @return 返回登录页面
	 */
	@RequestMapping(value = "/loginOut")
	public String loginOut(Admin admin, Model model, HttpSession session) {
		session.invalidate(); // 使会话失效，退出登录
		return "login"; // 返回登录页面
	}

	/**
	 * 分页查询
	 * @param a_username 管理员用户名
	 * @param a_describe 管理员描述信息
	 * @param pageIndex 当前页索引
	 * @param a_id 管理员ID
	 * @param pageSize 每页显示数量
	 * @param model 用于向视图传递数据
	 * @return 返回管理员列表页面
	 */
	@RequestMapping(value = "/findAdmin")
	public String findAdmin(String a_username, String a_describe, Integer pageIndex,
							Integer a_id, Integer pageSize, Model model) {
		PageInfo<Admin> ai = adminService.findPageInfo(a_username, a_describe, a_id, pageIndex, pageSize); // 获取分页信息
		model.addAttribute("ai", ai); // 添加分页信息到模型
		return "admin_list"; // 返回管理员列表页面
	}

	/**
	 * 导出Excel
	 * @return 管理员列表
	 */
	@RequestMapping(value = "/exportadminlist", method = RequestMethod.POST)
	@ResponseBody
	public List<Admin> exportAdmin() {
		List<Admin> admin = adminService.getAll(); // 获取所有管理员信息
		return admin; // 返回管理员列表
	}

	/**
	 * 添加管理员信息
	 * @param admin 管理员对象，包含管理员信息
	 * @return 返回管理员列表页面的重定向
	 */
	@RequestMapping(value = "/addAdmin", method = RequestMethod.POST)
	@ResponseBody
	public String addAdmin(@RequestBody Admin admin) {
		admin.setA_password(MD5Util.MD5EncodeUtf8(admin.getA_password())); // 对密码进行MD5加密
		int a = adminService.addAdmin(admin); // 添加管理员信息
		return "admin_list"; // 返回管理员列表页面
	}

	/**
	 * 删除管理员信息
	 * @param a_id 管理员ID
	 * @return 返回管理员列表页面的重定向
	 */
	@RequestMapping("/deleteAdmin")
	@ResponseBody
	public String deleteAdmin(Integer a_id) {
		int a = adminService.deleteAdmin(a_id); // 删除指定ID的管理员信息
		return "admin_list"; // 返回管理员列表页面
	}
	/**
	 * 修改管理员信息
	 * @param admin 管理员对象，包含修改后的信息
	 * @return 返回管理员列表页面的重定向
	 */
	@RequestMapping(value = "/updateAdmin", method = RequestMethod.POST)
	public String updateAdmin(Admin admin) {
		admin.setA_password(MD5Util.MD5EncodeUtf8(admin.getA_password())); // 对密码进行MD5加密
		int a = adminService.updateAdmin(admin); // 更新管理员信息
		return "redirect:/findAdmin"; // 重定向到查询管理员
	}

	/**
	 * 根据管理员Id搜索
	 * @param a_id 管理员ID
	 * @param session 管理员会话管理
	 * @return 返回管理员编辑页面
	 */
	@RequestMapping("/findAdminById")
	public String findAdminById(Integer a_id, HttpSession session) {
		Admin a = adminService.findAdminById(a_id); // 根据ID查询管理员信息
		session.setAttribute("a", a); // 保存管理员信息到会话中
		return "admin_edit"; // 返回管理员编辑页面
	}
}
